package com.df.my_net_game.game_rpc;

import com.baidu.bjf.remoting.protobuf.Codec;
import com.baidu.bjf.remoting.protobuf.ProtobufProxy;
import io.netty.channel.Channel;
import lombok.Data;

import java.io.IOException;

@Data
public class EzGameMsg {
    private Integer cmdId;
    GRpcHeader header;
    byte[] bodyBytes;
    Object bodyObj;
    Channel channel;
    public byte[] toBodyBytes(){
        if(bodyObj==null){
            return null;
        }
        if(bodyBytes==null){
            toBodyBytesDo();
        }
        return bodyBytes;
    }

    private void toBodyBytesDo() {
        //如果是基本类型，则进行包装

        //不是基本类型，则使用工具进行编码
        Codec codec = ProtobufProxy.create(this.bodyObj.getClass());
        if(codec!=null){
            try {
                this.bodyBytes = codec.encode(this.bodyObj);
            } catch (IOException e) {
                //TODO 是打印错误还是直接抛出错误呢？
                e.printStackTrace();
            }
        }
    }

    public <T> T getBodyObjBytes(Class<T> clazz){
        if(clazz==null){
            return null;
        }
        if(this.bodyBytes==null){
            return null;
        }
        Codec<T> codec = ProtobufProxy.create(clazz);
        T decode = null;
        try {
            decode = codec.decode(this.bodyBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return decode;
    }
}
